home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1994 October / macformat-005.iso / Shareware City / Developers / Incognito 1.2ß2 src Folder / Incognito ƒ / init / Init.c next >
Encoding:
C/C++ Source or Header  |  1994-05-23  |  2.9 KB  |  144 lines  |  [TEXT/MPS ]

  1. #include <Memory.h>
  2. #include <Resources.h>
  3. #include <GestaltValue.h>
  4. #include <Exceptions.h>
  5. #include <PLstringfuncs.h>
  6. #include <Folders.h>
  7. #include <TextUtils.h>
  8. #include <OSUtils.h>
  9. #include <GestaltEqu.h>
  10. #include <Files.h>
  11. #include "Common.h"
  12.  
  13. #define BTstQ(arg, bitnbr)        (arg & (1 << bitnbr))
  14.  
  15. static void InsertItems(OriginalLinkPtr pb)
  16. {
  17.     Handle            temp;
  18.     Str32            rName;
  19.     short            rID;
  20.     OSType            rType;
  21.     OriginalLinkPtr newLink;
  22.     short            numTypes = Count1Resources('KILL');
  23.     
  24.     while (numTypes)
  25.     {
  26.         temp = Get1IndResource('KILL', numTypes);
  27.         if (temp)
  28.         {
  29.             long    size;
  30.             GetResInfo(temp, &rID, &rType, rName);
  31.             newLink = (OriginalLinkPtr) NewPtrSysClear(sizeof(OriginalLink));
  32.             if ((size = GetHandleSize(temp)) == sizeof(long))
  33.             {
  34.                 newLink->objectPrefs = *((long *) *temp);
  35.             }
  36.             else
  37.             {
  38.                 newLink->objectPrefs = kLookupEnabled + kLookupAsync;
  39.             }
  40.             ReleaseResource(temp);
  41.             if (!newLink) return;
  42.             PLstrcpy(newLink->originalName, rName);
  43.             pb->next = newLink;
  44.             pb = pb->next;
  45.         }
  46.         numTypes--;
  47.     }
  48. }
  49.  
  50. static OSType InsertNames(OriginalLinkPtr pb)
  51. {
  52.     Str255    theString;
  53.     short    refNum;
  54.     FSSpec    theFile;
  55.     OSType    theType = kDefaultSelector;
  56.     long    gesResponse;
  57.     
  58.     FindFolder(-1, kPreferencesFolderType, true, &theFile.vRefNum, &theFile.parID);
  59.     GetIndString(theString, kPrefsName, 1);
  60.     if (!theString[0])
  61.     {
  62.         PLstrcpy(theFile.name, "\pIncognito Prefs");
  63.     }
  64.     PLstrcpy(theFile.name, theString);
  65.  
  66.     // are FS Calls available?
  67.     if ((!Gestalt (gestaltFSAttr, &gesResponse) && BTstQ (gesResponse, gestaltHasFSSpecCalls)))
  68.     {
  69.         refNum = FSpOpenResFile(&theFile, fsRdPerm);
  70.         if (refNum == -1)
  71.         {
  72.             FSpCreateResFile(&theFile, theType, 'pref', 0);
  73.             refNum = FSpOpenResFile(&theFile, fsRdPerm);
  74.         }
  75.         else
  76.         {
  77.             FInfo    theInfo;
  78.             
  79.             FSpGetFInfo(&theFile, &theInfo);
  80.             theType = theInfo.fdCreator;
  81.         }
  82.     }
  83.     else
  84.     {
  85.         refNum = HOpenResFile(theFile.vRefNum, theFile.parID, theFile.name, fsRdPerm);
  86.         if (refNum == -1)
  87.         {
  88.             HCreateResFile(theFile.vRefNum, theFile.parID, theFile.name);
  89.             refNum = -1;
  90.         }
  91.         else
  92.         {
  93.             FInfo    theInfo;
  94.             if (!HGetFInfo(theFile.vRefNum, theFile.parID, theFile.name, &theInfo))
  95.             theType = theInfo.fdCreator;
  96.         }
  97.     }
  98.     if (refNum != -1)
  99.     {
  100.         InsertItems(pb);
  101.         CloseResFile(refNum);
  102.     }
  103.     return theType;
  104. }
  105.  
  106. OSType Initialize(long *theResult)
  107. {
  108.     OSErr            error;
  109.     MyGestaltPtr    pb;
  110.     NameLinkPtr        pc;
  111.     OriginalLinkPtr    pd;
  112.     OSType            theType;
  113.     SysEnvRec        theWorld;
  114.     
  115.     *theResult = 0;
  116.     
  117.     SysEnvirons(1, &theWorld);
  118.     if (theWorld.systemVersion < 0x0605) return 0;    // system 6!
  119.     
  120.     pb = (MyGestaltPtr)NewPtrSysClear(sizeof(MyGestaltRecord));
  121.     require(pb, mygestalt);
  122.     
  123.     pc = (NameLinkPtr)NewPtrSysClear(sizeof(NameLink));
  124.     require(pc, namelink);
  125.     
  126.     pd = (OriginalLinkPtr)NewPtrSysClear(sizeof(OriginalLink));
  127.     require(pd, origlink);
  128.     
  129.     pb->registeredNames = pc;
  130.     pb->trappedNames = pd;
  131.     
  132.     theType = InsertNames(pd);
  133.     
  134.     *theResult = (long)pb;
  135.     
  136.     return theType;
  137.     
  138. origlink:
  139.     DisposePtr((Ptr) pc);
  140. namelink:
  141.     DisposePtr((Ptr) pb);
  142. mygestalt:
  143.     return 0;
  144. }